pomaly SELECT na FB

Otázka od: bleak

16. 11. 2002 15:28

zdravim,
mám tabulku indexovanou podle nekolika poli, napr. ID_KLIENTA, ID_SLUZBY.
Zakaznik ale pozaduje moznost hledani podle vsech poli v tabulce. Tabulka ma
cca 500000 zaznamu a nez se provede napr. SELECT * FROM t1 WHERE text LIKE
'%11/2002%' trva to asi tak 2-3 minuty.
Lze tohle hledani nejak optimalizovat - zrychlit? Vytvaret podle potreby
vhodny index se mi nezda vhodne...

bleak

Odpovedá: MUDr. Patrik VALENTA

16. 11. 2002 22:10

Taky hodne pomuze, kdyz misto select * vypises konkretni polozky .. urcite
je nepotrebujes vsechny pro vypis

valik

----- Original Message -----
> Zakaznik ale pozaduje moznost hledani podle vsech poli v tabulce. Tabulka
ma
> cca 500000 zaznamu a nez se provede napr. SELECT * FROM t1 WHERE text LIKE
> '%11/2002%' trva to asi tak 2-3 minuty.
> Lze tohle hledani nejak optimalizovat - zrychlit? Vytvaret podle potreby
> vhodny index se mi nezda vhodne...

Odpovedá: Jan Sebelík

16. 11. 2002 19:28

> Odesílatel: bleak <bleak@mvesely.com>
> Zakaznik ale pozaduje moznost hledani podle vsech poli v tabulce. Tabulka ma
> cca 500000 zaznamu a nez se provede napr. SELECT * FROM t1 WHERE text LIKE
> '%11/2002%' trva to asi tak 2-3 minuty.
> Lze tohle hledani nejak optimalizovat - zrychlit? Vytvaret podle potreby
> vhodny index se mi nezda vhodne...

No, tezko rici, zda ti to pomuze, ale zkusenost jedne firmy, ktera pracovala s
tak velkymi databazemi, ze jim importy v prvni verzi trvaly vice nez 24 hodin:

Indexum se nebranit, ale vypinat je (alter index xxx inactive).
Prace s databazi je o mnoho rychlejsi.
Kdyz je index zase potreba, tak ho aktivovat. Neco to trva, ale v souctu se to
mnohonasobne vyplati.

Mozna to je ale uzitecne jenom pro ty importy...

Honza
=========================================
= HAES - RNDr. Jan Sebelik
= http://www.haes.cz
= Skolici a konzultacni stredisko pro Delphi a Win32
= Vojtiskova 206
= 507 81 Lazne Belohrad
= tel. 493 792 931 (mobil 776 347735)
=========================================

Odpovedá: Petr Fejfar

16. 11. 2002 20:56

From: "bleak" <bleak@mvesely.com>



> SELECT * FROM t1 WHERE text LIKE '%11/2002%'
> trva to asi tak 2-3 minuty.
> Lze tohle hledani nejak optimalizovat - zrychlit?

Pokud mas na mysli, jak zrychlit operaci typu
CONTAINING, tak s tim se v relacni databazi
moc udelat neda, jedine pokud je SQL server
hybridem mezi RDBMS a full-textovym enginem jako
napr. MSSQL, tak se da k tabulce vytvaret
full-textovy katalog a indexy.

Jinak u relacnich DB takova operace zpravidla
signalizuje, ze atribut obsahuje neskalarni
velicinu a tudiz relace neni ani v 1NF
a jedna se tedy o chybnou analyzu.

Pokud napr. potrebujes hledat mesic & rok
a ne prosty textovy retezec, tak bys mel opravit
model, aby odpovidal semantice reseneho problemu.


HTH, pf


Odpovedá: Jan Sebelík

17. 11. 2002 11:07

> Odesílatel: Petr Fejfar <development@callnet.cz>
> Pokud napr. potrebujes hledat mesic & rok
> a ne prosty textovy retezec, tak bys mel opravit
> model, aby odpovidal semantice reseneho problemu.

Dotaz asi smeroval trochu jinam, presto dekuji Petrovi za vysloveny nazor.

V konferenci se casto objevuji dotazy "jak na tento problem...", pritom problem
by vubec nevznikl, kdyby byla spravna vychodiska.

Ono je to tezke, dostat snadno a rychle data z databaze, kdyz je spatne
navrzena. Podobne snahy o "curani proti vetru", myslim programovani proti
standardum Windows, ktere zde nedavno komentoval treba Petr Vones.

Pokud si mohu dovolit nazor: umeni programovat nespociva az tak v umeni resit
problemy, jako v umeni vyhybat se jim.

Honza
=========================================
= HAES - RNDr. Jan Sebelik
= http://www.haes.cz
= Skolici a konzultacni stredisko pro Delphi a Win32
= Vojtiskova 206
= 507 81 Lazne Belohrad
= tel. 493 792 931 (mobil 776 347735)
=========================================

Odpovedá: bleak

17. 11. 2002 14:50

upresnim to, tabulka ma 15 poli, datove typy jsou Date, Integer a Char.
Zakaznik požaduje hledani, tedy SELECT podle libovolneho pole nebo poli
tabulky. Ve vysledku musi byt vsechna pole.
Neco jsem tady v prvnim mejlu nenapsal (sorry), ten SELECT z t1 trva kolem 7
vterin, jenze ja jsem delal tuto vec:

SELECT DISTINCT(*.t0) FROM t0 zk
JOIN t1 pl on
zk.id_klienta=pl.id_klienta
WHERE pl.text LIKE '%neco%'
a to je fatalne pomale - 3 minuty.

Kdyt indexuji vsechna pole (je to vhodne?), tak to trva zase cca 7 vterin.
Je lepsi vytvorit jeden index na vsechna pole, nebo pro kazde pole zvlast?
Ale tohle reseni se mi nelibi, zkusim vymyslet jiny SQL dotaz. Budu vdecny
za vase dalsi tipy.
bleak

----- Original Message -----
From: "Petr Fejfar" <development@callnet.cz>
> > SELECT * FROM t1 WHERE text LIKE '%11/2002%'
> > trva to asi tak 2-3 minuty.
> > Lze tohle hledani nejak optimalizovat - zrychlit?
>
> Pokud mas na mysli, jak zrychlit operaci typu
> CONTAINING, tak s tim se v relacni databazi




Odpovedá: bleak

17. 11. 2002 15:01

jak pisu v jinem mejlu, zapomnel jsem neco upresnit, prosty select trva 7
vterin.
Databaze je navrzena dobre. Programovat umim, i kdyz nejsem profesional.
bleak

----- Original Message -----
From: "Jan Sebelík" <honza@haes.cz>


> Odesílatel: Petr Fejfar <development@callnet.cz>
> Pokud napr. potrebujes hledat mesic & rok
> a ne prosty textovy retezec, tak bys mel opravit
> model, aby odpovidal semantice reseneho problemu.

Ono je to tezke, dostat snadno a rychle data z databaze, kdyz je spatne
navrzena. Podobne snahy o "curani proti vetru", myslim programovani proti
standardum Windows, ktere zde nedavno komentoval treba Petr Vones.
Pokud si mohu dovolit nazor: umeni programovat nespociva az tak v umeni
resit problemy, jako v umeni vyhybat se jim.
Honza

Odpovedá: bleak

17. 11. 2002 15:29

to ne, byl to pouze priklad, tabulka samozrejme ma pole DATUM...
a je mozne pouzit
SELECT * FROM t1 WHERE
EXTRACT(MONTH FROM DATUM)=11 AND
EXTRACT(YEAR FROM DATUM)=2001

vyber z 500000 zaznamu trva 6-7 vterin bez indexu, sorry za nepresny popis
toho co
potrebuji...

> Pokud napr. potrebujes hledat mesic & rok
> a ne prosty textovy retezec, tak bys mel opravit
> model, aby odpovidal semantice reseneho problemu.
>
>
> HTH, pf
>
>
>
>
>

Odpovedá: Petr Fejfar

17. 11. 2002 16:06

From: "bleak" <bleak@mvesely.com>

> Neco jsem tady v prvnim mejlu nenapsal (sorry),
> ten SELECT z t1 trva kolem 7
> vterin, jenze ja jsem delal tuto vec:

Ja tady mam v IB databazi s cca polovinou zaznamu nez ty a casy na notebooku
dostanu u podobneho dotazu taky asi polovicni, teda az na ty 3 minuty - me
to chodi vsechno zhruba stejne rychle  

Mozna by neskodilo, abys popsal, jake kde mas indexy a mozna bys cvicne mohl
zrusit ten DISTINCT, ale tim to IMHO nebude.


HTH, pf


Odpovedá: bleak

17. 11. 2002 16:25

vyreseno:
SELECT DISTINCT(zk.*) FROM platby pl
LEFT JOIN zakaznik zk ON
zk.id_klienta=pl.id_klienta
WHERE pl.text LIKE '%11/2002%'

trvani dotazu: 7,260 vteriny.
bleak

----- Original Message -----
From: "Jan Sebelík" <honza@haes.cz>

V konferenci se casto objevuji dotazy "jak na tento problem...", pritom
problem by vubec nevznikl, kdyby byla spravna vychodiska.
Ono je to tezke, dostat snadno a rychle data z databaze, kdyz je spatne
navrzena. Podobne snahy o "curani proti vetru", myslim programovani proti
standardum Windows, ktere zde nedavno komentoval treba Petr Vones.
Pokud si mohu dovolit nazor: umeni programovat nespociva az tak v umeni
resit problemy, jako v umeni vyhybat se jim.

Honza

Odpovedá: Jan Sebelík

18. 11. 2002 7:36

> Odesílatel: bleak <bleak@mvesely.com>
> Databaze je navrzena dobre. Programovat umim, i kdyz nejsem profesional.
> bleak
Ta poznamka nebyla smerovana tobe, byla to jenom obecna uvaha do konference.
Jenom jsem chtel rici, ze drive, nez zacnu neco (obtizne) resit, dukladne se
zeptam, zda bych nemohl (snadno) resit neco jineho, co prinese stejny nebo
lepsi efekt.
Dotazy do konference nekdy signalizuji presny opak, se mi zda  , tak jsem si
tu poznamku dovolil.

Honza
=========================================
= HAES - RNDr. Jan Sebelik
= http://www.haes.cz
= Skolici a konzultacni stredisko pro Delphi a Win32
= Vojtiskova 206
= 507 81 Lazne Belohrad
= tel. 493 792 931 (mobil 776 347735)
=========================================

Odpovedá: Zhasil Radek

18. 11. 2002 9:49

Bohuzel, pokud pouzijes ve vyberove podmince procenta na zacatku hledaneho
vyrazu, tak se index stejne nepouzije. Ostatne to lze vysledovat, kdyz se
podivas na PLAN tohoto dotazu.


> Neco jsem tady v prvnim mejlu nenapsal (sorry), ten SELECT z
> t1 trva kolem 7
> vterin, jenze ja jsem delal tuto vec:
>
> SELECT DISTINCT(*.t0) FROM t0 zk
> JOIN t1 pl on
> zk.id_klienta=pl.id_klienta
> WHERE pl.text LIKE '%neco%'
> a to je fatalne pomale - 3 minuty.
>
> Kdyt indexuji vsechna pole (je to vhodne?), tak to trva zase
> cca 7 vterin.